Android:BottomNavigationView设置noActionbar主题后闪退的解决方法,以及另外两种实现方法 您所在的位置:网站首页 android studio为什么闪退 Android:BottomNavigationView设置noActionbar主题后闪退的解决方法,以及另外两种实现方法

Android:BottomNavigationView设置noActionbar主题后闪退的解决方法,以及另外两种实现方法

2024-06-29 23:36| 来源: 网络整理| 查看: 265

Android Studio自带的BottomNavigationView项目设置了noActionbar这个主题就会闪退

原因是Android Studio自带的BottomNavigationView项目使用了Jetpack的Navigation做为页面的切换工具,每切换一次Fragment就会设置一次toobar的title,因此如果设置了noActionbar这个主题,就会因为Fragment设置title时找不到toobar而闪退

不设置noActionbar的话就无法使用toolbar,蛋疼。

下面我会介绍两种BottomNavigationView的实现方法:

一种是Android Studio自带的项目实现,使用Jetpack的Navigation做为页面的切换工具,以及说明为什么自带的基础模板不能设置noActionbar的原因 (如果你对Android Studio自带的BottomNavigationView实现不敢兴趣,或是不熟悉Android Jetpack,请直接看第二种实现方式,因为目前自带的BottomNavigationView还是实现不了设置noActionbar主题)

另一种是BottomNavigationView + viewPage( 使用viewPage做为页面切换工具)的实现方法

先看一下两者的实现效果对比

使用Android Studio自带的项目实现(Navigation做为页面的切换工具):

(不能滑动切换,切换效果为淡入淡出) 在这里插入图片描述

BottomNavigationView + viewPage( 使用viewPage做为页面切换工具):

(可以滑动切换,切换效果为左右位移) 在这里插入图片描述

1 使用Android自带的BottomNavigationView项目: 1.1 首先创建一个自带的BottomNavigationView项目,然后看一下目录结构:在这里插入图片描述 1.2 很明显这是一个基于jetpack的项目,其中meun用来保存底部item的布局文件:

meun中的代码: 在这里插入图片描述 对应位置: 在这里插入图片描述

1.3 看一下navigation中的布局

或许现在看这些好像没什么用,待会看mainactivity中的代码实现你就知道了 在这里插入图片描述

1.4 看一下mainActivity中的代码是如何实现BottomNavigationView页面切换的:

在这里插入图片描述 到这里就明了了,Android Studio帮我们创建的是使用Navigation来作为切换页面工具的BottomNavigationView项目,但是Navigation作为Jetpack中的一员,才刚刚出来没多久,难免会有些不足之处。

不能设置noActionbar的问题就在于Navigation有一项默认设置,是把当前Fragment标题设置成actionBar的title,要是把ActionBar去掉了,它就会因为找不到ActionBar而报错,然后闪退,所以到目前为止,想要用noActionbar主题,还是需要用viewPage作为页面切换工具… 2 使用viewPage作为页面切换工具来实现BottomNavigationView的切换(当然也可以使用viewPage2,viewPage的升级版2019年的,有兴趣的同学可以看看) 2.1 首先我们需要为viewPage设置一个adapter适配器,下面是模板: /** * viewPage初始化 * 获取viewPager,并为其设置适配器 */ private void initViewPage() { viewPager = findViewById(R.id.viewpage); viewPager.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) { @NonNull @Override public Fragment getItem(int position) { Fragment fragment = null; /** *页面选中判断,当到达指定position时,返回position对应的页面 */ switch ( position ){ case 0: fragment = new HomeFragment(); break; case 1: fragment = new GoodsClassFragment(); break; case 2: fragment = new ShopCatFragment(); break; case 3: fragment = new PersonCenterStart(); break; } assert fragment != null; return fragment; } /** *这里需要填写总的页面数量 */ @Override public int getCount() { return 4; } }); //viewPager滑动事件监听 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { bottomNavigationView.getMenu().getItem(position).setChecked(true); } @Override public void onPageScrollStateChanged(int state) { } }); } 2. 我们需要为BottomNavigationView设置item选择监听事件,下面是模板 /** * 底部导航栏初始化 */ private void initBottomNav() { bottomNavigationView = findViewById(R.id.bv); bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { /** *当点击到菜单中的item时,调用viewPage中的setCurrentItem方法切换到对应界面 */ switch ( item.getItemId() ){ case R.id.navigation_home: viewPager.setCurrentItem(0); break; case R.id.navigation_goodsClass: viewPager.setCurrentItem(1); break; case R.id.navigation_shopCat: viewPager.setCurrentItem(2); break; case R.id.navigation_personalCenter: viewPager.setCurrentItem(3); break; } return false; } }); } 3. 之后在onCreate中执行即可: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //状态栏文字自适应 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); initViewPage(); initBottomNav(); }

这样我们就完成了一个viewPage+BottomNavigationView的实现。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有